<?php

require_once('../krn_table.php');
require_once('../fct_dao_statut.php');
require_once('../commons_constantes.php');

tableDefinition
	(TABLE_DEFINITION
	,'tblInvite'
	,WEDDING_DBNAME
	,'INVITE'
	,array
		('ID'
		,'ID_MARIAGE'
		,'CIVILITE'
		,'NOM'
		,'PRENOM'
		,'EMAIL'
		,'TELEPHONE_FR'
		,'PRESENCE_CONFIRMEE'
		,'ID_STATUT'
		,'DATE_INSERTION'
		,'DATE_MAJ'
		)
	);
	
	
/***********************************************************************************************************
 * Définition des fonctions d'interactions
 ***********************************************************************************************************/

/**
 * Fonction permettant d'ajouter un invité pour le mariage d'identifiant donné par le premier paramètre
 * @param $idMariage identifiant du mariage dont la personne à ajouter est invitée
 * @param $civilite civilité de l'invité
 * @param $nom nom de l'invité
 * @param $prenom prénom éventuel de l'invité
 * @param $email email éventuel de l'invité
 * @param $presence booléen disant si la présence de l'invité est confirmée ou non
 * @param $telephone numéro de téléphone français de l'invité
 * @return int : l'identifiant de l'invité ajouté
 */
function ajouterInvite
	($idMariage
	,$civilite
	,$nom
	,$prenom
	,$email=null
	,$telephone=null
	,$presence=false
	,$dateInsertion=null
	)
{
	$dateMaj = gmdate('c');
	if ($dateInsertion == null) {
		$dateInsert = $dateMaj;
	} else {
		$dateInsert = $dateInsertion;
	}
	$idInserted = insert
					('tblInvite'
					,array
						('ID_MARIAGE'			=> '?'
						,'CIVILITE'				=> '?'
						,'NOM'					=> '?'
						,'PRENOM'				=> '?'
						,'EMAIL'				=> '?'
						,'TELEPHONE_FR'			=> '?'
						,'PRESENCE_CONFIRMEE'	=> '?'
						,'ID_STATUT'			=> '?'
						,'DATE_INSERTION'		=> '?'
						,'DATE_MAJ'				=> '?'
						)
					,array
						($idMariage
						,$civilite
						,htmlEncode($nom)
						,htmlEncode($prenom)
						,htmlEncode($email)
						,$telephone
						,intval($presence)
						,getIdStatutByPresence($presence)
						,$dateInsert
						,$dateMaj
						)
					);
	return $idInserted;
}

/**
 * Ajoute la liste des invités fournis en entrée (sous forme de tableau de tableaux)
 * @param $listInvites tableau de tableaux d'invités à ajouter
 * @return : retourne la liste des invités non ajoutés (index numéro 2) ainsi que la liste des identifiants des invités ajoutés ((index numéro 1))
 */
function ajouterListInvites ($listInvites) {
	$dateInsert = gmdate('c');
	$idInvites = array();
	$invitesNonAjoutes = array();
	foreach ($listInvites as $idx => $invite) {
		try {
			$idInvites[] = ajouterInvite
						($invite[KEY_INVITE_IDMARIAGE]
						,$invite[KEY_INVITE_CIVILITE]
						,$invite[KEY_INVITE_NOM]
						,$invite[KEY_INVITE_PRENOM]
						,$invite[KEY_INVITE_EMAIL]
						,$invite[KEY_INVITE_TELEPHONE]
						,$invite[KEY_INVITE_CONFIRME]
						);
		} catch (Exception $e) {
			logError($e->getTraceAsString());
			$invitesNonAjoutes[$idx] = $invite;
		}
	}
	return array
		($idInvites
		,$invitesNonAjoutes
		);
}

/**
 * Retourne le tableau associatif de l'invité d'identifiant $idInvite.<br />
 * Retourne un tableau vide si l'invité d'identifiant $idInvite n'existe pas
 * @param $idInvite identifiant de l'invité à récupérer
 * @return array : un tableau vide ou associatif nom de colonne - valeur
 * @throws Exception : code 406 (plusieurs ressources)
 */
function getInvite($idInvite) {
	$invite = select('tblInvite', '*', 'WHERE ID = ?', array($idInvite));
	if (count($invite) > 1) {
		throw new Exception('Plusieurs invités d\'identifiant '.$idInvite.' ont été retournés', ERR_NOT_ACCEPTABLE);
	} elseif (count($invite) == 1) {
		return $invite[0];
	}
	return $invite;
}

/**
 * Retourne la liste des invités du mariage d'identifiant $idMariage
 * @param $idMariage identifiant du mariage pour lequel on cherche la liste des invités
 * @param $typeListe type de liste cherchée : invités supprimés ou non
 * @return array : liste vide ou liste des invités du mariage d'identifiant $idMariage
 */
function getListeInvitesByMariage($idMariage, $typeListe=LISTE_INVITE_NON_SUPPRIME) {
	return getListeInvitesTriesParNom($idMariage, 'TOUS', $typeListe);
}

/**
 * Retourne la liste
 * @param $idMariage
 * @param $sort
 * @param $typeListe
 */
function getListeInvitesTriesParNom($idMariage, $sort='TOUS', $typeListe=LISTE_INVITE_NON_SUPPRIME) {
	$upSort = strtoupper($sort);
	$alphabet = getAlphabet();
	$listInvites = array();
	
	if ($typeListe === LISTE_INVITE_NON_SUPPRIME) {
		$filter = 'AND ID_STATUT <> ?';
	} elseif ($typeListe === LISTE_INVITE_SUPPRIME) {
		$filter = 'AND ID_STATUT = ?';
	} else {
		// Par défaut, pour le moment, on ne remonte pas les invités supprimés
		$filter = 'AND ID_STATUT <> ?';
	}
	
	$order = 'ORDER BY NOM ASC';
	
	//Récupérer le statut correspondant au code SUPPRIME
	$statut = getStatutByCode(STATUT_SUPPRIME);
	
	if ($upSort === 'TOUS' || !in_array($upSort, $alphabet)) {
		$selQuery = 'SELECT * FROM '.tableNameGet('tblInvite')." WHERE ID_MARIAGE=? $filter $order";
		$bindings = array($idMariage, $statut['ID']);
		$listInvites = executeSelectQuery('tblInvite', $selQuery, $bindings);
	} else {
		$selQuery = 'SELECT * FROM '.tableNameGet('tblInvite')." WHERE ID_MARIAGE=? AND NOM LIKE '$upSort%' $filter $order";
		$bindings = array($idMariage, $statut['ID']);
		$listInvites = executeSelectQuery('tblInvite', $selQuery, $bindings);
	}
	return $listInvites;
}

/**
 * Mets à jour l'invité d'id $idInvite pour le mariage $idMariage
 * @param $idMariage
 * @param $idInvite
 * @param $civilite
 * @param $nom
 * @param $prenom
 * @param $email
 * @param $telephone
 * @param $presence
 * @param $dateMaj
 * @return true / false
 */
function updateInvite
	($idMariage
	,$idInvite
	,$civilite
	,$nom
	,$prenom
	,$email=null
	,$telephone=null
	,$presence=false
	,$dateMaj=null
	)
{
	if ($dateMaj == null) {
		$dateMaj = gmdate('c');
	}
					
	$updated = update
			('tblInvite'
			,array
				('CIVILITE'				=> '?'
				,'NOM'					=> '?'
				,'PRENOM'				=> '?'
				,'EMAIL'				=> '?'
				,'TELEPHONE_FR'			=> '?'
				,'PRESENCE_CONFIRMEE'	=> '?'
				,'ID_STATUT'			=> '?'
				,'DATE_MAJ'				=> '?'
				)
			,'WHERE ID_MARIAGE=? AND ID=?'
			,array
				($civilite
				,htmlEncode($nom)
				,htmlEncode($prenom)
				,htmlEncode($email)
				,$telephone
				,intval($presence)
				,getIdStatutByPresence($presence)
				,$dateMaj
				,$idMariage
				,$idInvite
				)
			);
	return $updated;
}

/**
 * Annule l'invité d'identifiant $idInvite pour le mariage d'identifiant $idMariage.<br />
 * La suppression étant logique, elle consiste à changer le statut de l'invité dans le statut correspondant
 * à Annulé
 * @param $idMariage
 * @param $idInvite
 * @param $dateMaj
 * @return boolean : true en cas de succès
 */
function annulerInvite
	($idMariage
	,$idInvite
	,$dateMaj=null
	)
{
	return updateStatutInvite
			(STATUT_ANNULE
			,$idMariage
			,$idInvite
			,$dateMaj
			);
}

/**
 * Supprime l'invité d'identifiant $idInvite pour le mariage d'identifiant $idMariage.<br />
 * La suppression étant logique, elle consiste à changer le statut de l'invité dans le statut correspondant
 * à Supprimé
 * @param $idMariage
 * @param $idInvite
 * @param $dateMaj
 * @return boolean : true en cas de succès
 */
function supprimerInvite
	($idMariage
	,$idInvite
	,$dateMaj=null
	)
{
	return updateStatutInvite
			(STATUT_SUPPRIME
			,$idMariage
			,$idInvite
			,$dateMaj
			);
}

/**
 * Mets à jour le statut de l'invité d'identifiant $idInvite pour le mariage d'identifiant $idMariage avec l'identifiant
 * du code statut donné par $codeStatut<br />
 * @param $codeStatut
 * @param $idMariage
 * @param $idInvite
 * @param $dateMaj
 * @return boolean : true en cas de succès
 */
function updateStatutInvite
	($codeStatut
	,$idMariage
	,$idInvite
	,$dateMaj=null
	)
{
	if ($dateMaj == null) {
		$dateMaj = gmdate('c');
	}
	
	//Récupérer le statut correspondant au code $codeStatut
	$statut = getStatutByCode($codeStatut);
					
	$updated = update
			('tblInvite'
			,array
				('ID_STATUT'			=> '?'
				,'DATE_MAJ'				=> '?'
				)
			,'WHERE ID_MARIAGE=? AND ID=?'
			,array
				($statut['ID']
				,$dateMaj
				,$idMariage
				,$idInvite
				)
			);
	return $updated;
}

/**
 * Restaure tous les invités de la liste qui sont dans le statut "Supprimé"
 * @param $idMariage
 * @param $idInvite
 * @param $dateMaj
 */
function restaurerInvite
	($idMariage
	,$idInvite=null
	,$dateMaj=null
	)
{
	if ($dateMaj == null) {
		$dateMaj = gmdate('c');
	}
	
	//Récupérer le statut correspondant au code "En attente"
	$idStatutByCode = getAllIdStatutByCode();
	
	$where = 'WHERE ID_MARIAGE=? AND ID_STATUT=?';
	$bindings = array
				(intval(false)
				,$idStatutByCode[STATUT_EN_ATTENTE]
				,$dateMaj
				,$idMariage
				,$idStatutByCode[STATUT_SUPPRIME]
				);
	if ($idInvite != null && is_int($idInvite)) {
		$where .= ' AND ID=?';
		$bindings[] = $idInvite;
	}
					
	$updated = update
			('tblInvite'
			,array
				('PRESENCE_CONFIRMEE'	=> '?'
				,'ID_STATUT'			=> '?'
				,'DATE_MAJ'				=> '?'
				)
			,$where
			,$bindings
			);
	return $updated;
}

/**
 * Confirme l'invité d'identifiant $idInvite pour le mariage d'identifiant $idMariage, précédemment supprimé.<br />
 * La confirmation consiste à changer le statut de l'invité dans le statut correspondant à celui de la présence
 * @param $idMariage
 * @param $idInvite
 * @param $dateMaj
 * @return boolean : true en cas de succès
 */
function confirmerInvite
	($idMariage
	,$idInvite
	,$dateMaj=null
	)
{
	if ($dateMaj == null) {
		$dateMaj = gmdate('c');
	}
	
	//Récupérer l'invité
	$invite = getInvite($idInvite);

	$updated = update
			('tblInvite'
			,array
				('ID_STATUT'			=> '?'
				,'DATE_MAJ'				=> '?'
				)
			,'WHERE ID_MARIAGE=? AND ID=?'
			,array
				(getIdStatutByPresence($invite['PRESENCE_CONFIRMEE'])
				,$dateMaj
				,$idMariage
				,$idInvite
				)
			);
	return $updated;
}

/**
 * Retourne un identifiant de statut en fonction de la valeur true ou false du champ présence confirmée donné en paramètre.<br />
 * Retourne les identifiants pour les codes correspondant aux valeurs "Confirmé" si présence confirmée et "En attente" si non
 * @param boolean $presence
 * @return int : identifiant du statut
 * @throws Exception
 */
function getIdStatutByPresence($presence) {
	$idStatutByCode = getAllIdStatutByCode();
	$codeStatut = null;
	switch ($presence) {
		case true :
			$codeStatut = STATUT_CONFIRME;
			break;
			
		case false :
			$codeStatut = STATUT_EN_ATTENTE;
			break;
			
		default :
			throw new Exception('Valeur inattendue pour le champ présence_confirmé pour un invité donné', ERR_TECHNICAL);
	}
	
	if (!isset($idStatutByCode[$codeStatut])) {
		throw new Exception("Code statut '$codeStatut' non défini dans la liste des statuts donnée par $idStatutByCode", ERR_TECHNICAL);
	}
	return $idStatutByCode[$codeStatut];
}